package studentmanagement;

import java.util.ArrayList;
import java.util.List;

public class Student extends Person {
    // 学生特有属性：已选课程列表
    private List<Course> selectedCourses = new ArrayList<>();

    // 子类构造方法：通过super()调用父类构造
    public Student(String id, String name, String gender) {
        super(id, name, gender); // 调用父类构造方法初始化共性属性
    }

    // 选课方法（增加课程容量校验）
    public void selectCourse(Course course) {
        // 校验课程是否已选
        if (selectedCourses.contains(course)) {
            System.out.println(name + "已选过《" + course.getCourseName() + "》，无需重复选择");
            return;
        }
        // 校验课程容量
        if (course.isFull()) {
            System.out.println("《" + course.getCourseName() + "》已达最大容量，无法选择");
            return;
        }
        // 执行选课
        selectedCourses.add(course);
        course.addStudent(this); // 同步更新课程的已选学生
        System.out.println(name + "成功选择《" + course.getCourseName() + "》");
    }

    // 退课方法
    public void dropCourse(Course course) {
        if (selectedCourses.remove(course)) {
            course.removeStudent(this); // 同步更新课程的已选学生
            System.out.println(name + "成功退选《" + course.getCourseName() + "》");
        } else {
            System.out.println(name + "未选择《" + course.getCourseName() + "》，无法退选");
        }
    }

    // 打印已选课程（重写父类思想，实现学生特有业务）
    public void showSelectedCourses() {
        System.out.println("\n" + name + "的已选课程：");
        if (selectedCourses.isEmpty()) {
            System.out.println("暂无选课记录");
            return;
        }
        for (Course course : selectedCourses) {
            System.out.println("课程ID：" + course.getId() +
                    "，课程名：" + course.getCourseName() +
                    "，教师：" + course.getTeacher().name + // 访问父类protected属性
                    "，时间：" + course.getTime() +
                    "，地点：" + course.getLocation() +
                    "，已选人数：" + course.getCurrentStudents() + "/" + course.getCapacity());
        }
    }

    // 获取已选课程列表（供Course类调用）
    public List<Course> getSelectedCourses() {
        return selectedCourses;
    }
}